package org.ala.tiktools.rpc.plugin.node;


import java.util.Map;
import java.util.concurrent.CompletableFuture;

import org.ala.tiktools.rpc.msg.ack.RpcAckBody;

/**
 * 节点组件
 *
 * @author ala
 * @date 2025-04-04 14:50
 */
public interface INode {
    /**
     *  节点所属的组
     */
    String group();
    /**
     *  节点key
     */
    NodeKey key();


    /**
     *  发送数据
     *  <p> future里面是相应的方法返回值
     *  <p> 如果方法本身是void，则不会等待返回结果
     *  <p> 所以需要返回的地方，最好返回个状态位表示成功或失败
     */
    CompletableFuture<RpcAckBody> send(String url, Object[] args, Map<String, Object> metadata);
    /**
     *  发送数据，无需等待ack
     *  <p> future里面是相应的方法返回值
     *  <p> 如果方法本身是void，则不会等待返回结果
     *  <p> 所以需要返回的地方，最好返回个状态位表示成功或失败
     */
    void sendVoid(String url, Object[] args);


    /**
     *  节点当前状态
     */
    NodeStatusEnums status();
    /**
     *  激活节点
     */
    CompletableFuture<NodeStatusEnums> active();
    /**
     *  关闭节点
     *  <p> 关闭的连接和当前的连接，可能已经不是同一个连接
     *  <p> 因为关闭和重连动作是异步进行的
     */
    CompletableFuture<Boolean> close();
    /**
     *  节点摘除
     */
    CompletableFuture<Boolean> kill();
    /**
     *  节点复活状态
     *  <p> 只是把状态置为NEW
     */
    void revive();


    /**
     *  挂载状态变化监听
     */
    void addStatusListener(NodeStatusEnums status, Runnable run);

}
